package cn.edu.xjtu.data_structure.chapter02_stack_queue.queue;

/**
 * @author yjq
 * @version 1.0
 * @date 2021/9/17 9:21
 */
public class MyQueue {
    //重新构建队列的存储表示方法：使其能够将 n 个队列顺序映射到一个数组 listArray 中，
    // 每个队列都表示成内存中的一个循环队列
    private static final int DEFAULT_SIZT = 53;
    private int maxSize;//定义队列的实际最大容纳量+1
    private int[] front;//队首元素的前驱元素下标
    private int[] rear;//队尾元素下标
    private Object[] listArray;//存储元素的数组

    public MyQueue(int n, int size) {
        this.maxSize = size + 1;
        front = new int[n];
        rear = new int[n];
        listArray = new Object[n * maxSize];
    }

    public MyQueue(int n) {
        this(n, DEFAULT_SIZT);
    }
    //构造函数

    public Object[] getListArray() {
        return listArray;
    }
    //获得数组

    public void clear(int n) {//清空第n个队列元素
        front[n] = rear[n] = (n)*maxSize;
    }
    //清空

    public void enqueue(int n , Object it) {//进第n个队
        if (isFull(n)) {
            System.out.println("queue is full!");
            return;//队列已经满了
        }
        rear[n] = (rear[n]+1)%maxSize;
        listArray[rear[n]+(n)*maxSize] = it;
    }
    //入队

    public Object dequeue(int n) {//第n个队列出队
        if (isEmpty(n)) {
            System.out.println("queue is empty");
            return null;
        }
        front[n] = (front[n]+1)%maxSize;

        return listArray[front[n]+(n)*maxSize];

    }
    //出队

    public boolean isEmpty(int n) {//判断第n个队列是否为空
        return front[n] == rear[n];
    }
    //判断是否为空

    public boolean isFull(int n) {//判断第n个队列是否为满
        return front[n] == (rear[n]+1)%maxSize;
    }
    //判断是否为空
}
